<?php
namespace app\common;

use app\common\util\ErrCode;
use think\Db;

/**
 * restful 接口风格基类
 * Class RestfulApi
 * @package app\common
 */
class RestfulApi extends AuthApi  {
	protected $Table='';//查询的主表
	protected $Where=[];//查询条件
	protected $Field=true; //查询字段
	protected $Order='';  //排序条件
	protected $PrimaryKey=''; //主键
	protected $Prefix='';//字段前缀
	protected $SearchField='';// 搜索字段 以|分割不同的字段

	//join相关
	protected $Alias='a';//主表数据别名
	protected $Join=[];//Join语句

	protected $CreateDate=[];//需要新增的日期字段
	protected $UpdateDate=[];//需要更新的日期字段
	protected $IndexField='';//index查询字段  用于列表
	protected $FindField='';//find查询字段 用于单条数据

	//数据库链接对象，Db静态方法提供的对象全局唯一
	//所以各函数内需要操作其他表的时候
	//需要用db助手函数重新生成链接对象
	protected $Db=null;
	protected $Input=null;//前端上传过来的数据

	public function _initialize(){
		parent::_initialize(); // TODO: Change the autogenerated stub
		$this->Db=Db::name($this->Table);
		$this->Input=input(strtolower($this->request->method()).'.');//前端传来的数据
	}

	/**
	 * index前的钩子函数
	 * @return bool
	 */
	protected function beforeIndex(){
		return true;
	}

	/**index后的钩子函数
	 * @return bool
	 */
	protected function afterIndex(){
		return true;
	}

	/**
	 * 列表数据
	 * @return mixed|\think\response\Json
	 */
	public function index(){
		$key=input('key/s');
		if($key&&$this->SearchField) $this->Where[$this->SearchField]=['like',"%{$key}%"];
		$pagenum=config('page_num')?config('page_num'):10;

		//筛选条件
		if (input('get.where')!=''){
			//对传来的数据进行base64解码之类的操作
			$condition = json_decode(base64_decode(input('get.where')),true);
			$this->Where = array_merge($this->Where,$condition);
		}

		//加入不分页参数
		if(input('get.page')=='nopage'){
			$data=$this->Db->alias($this->Alias)->join($this->Join)->field($this->IndexField)
				->where($this->Where)->order($this->Order)->select();
		}else{
			$data=$this->Db->alias($this->Alias)->join($this->Join)->field($this->IndexField)
				->where($this->Where)->order($this->Order)->paginate($pagenum);
		}
		return $this->jsuccess($data);
	}

	/**
	 * read前的钩子函数
	 * @return bool
	 */
	protected function beforeRead(&$id,&$pk){
		return true;
	}

	/**read后的钩子函数
	 * @return bool
	 */
	protected function afterRead(&$data){
		return true;
	}

	/**
	 * GET
	 * @param $id   获取指定id的数据
	 */
	public function read($id){
		//获取表的主键
		$pk=$this->Db->getPk();
		if(true!==($result=$this->beforeRead($id,$pk))){
			return is_object($result)?$result:$this->jerror($result);
		}
		$data=$this->Db->alias($this->Alias)->join($this->Join)->field($this->FindField)->where($pk,$id)->find();
		if(true!==($result=$this->afterRead($data))){
			return is_object($result)?$result:$this->jerror($result);
		}
		return $this->jsuccess($data);
	}

	/**
	 * @param $data 提交的数据
	 * @param $id   需要更新的数据id
	 * @param $pk   数据表主键
	 * @return bool 返回执行结果，非true为错误信息
	 */
	protected function beforeUpdate(&$data,$id,$pk){
		return true;
	}


	/**
	 * PUT
	 * @param $id   更新指定id的数据
	 */
	final public function update($id){
		$data=procPrefix($this->Input,$this->Prefix);
		//加入时间字段
		foreach($this->UpdateDate as $item){
			$data[$item]=time();
		}
		//获取表的主键
		$pk=$this->Db->getPk();
		if(true!==($result=$this->beforeUpdate($data,$id,$pk))){
			return is_object($result)?$result:$this->jerror($result);
		}
		if(!$this->Db->where($pk,$id)->update($data)) return ErrCode::getError(102);
		if(true!==($result=$this->afterUpdate($data,$id,$pk))){
			return is_object($result)?$result:$this->jerror($result);
		}
		return $this->jsuccess();
	}

	/**
	 * @param $data 提交的数据
	 * @param $id   需要更新的数据id
	 * @param $pk   数据表主键
	 * @return bool 返回执行结果，非true为错误信息
	 */
	protected function afterUpdate(&$data,$id,$pk){
		return true;
	}


	/**
	 * @param $data 提交的数据
	 * @return bool 返回执行结果，非true为错误信息
	 */
	protected function beforeSave(&$data){
		return true;
	}

	/**
	 * POST
	 * 保存新的数据
	 */
	final public function save(){
		$data=procPrefix($this->Input,$this->Prefix);

		//加入时间字段
		foreach($this->CreateDate as $item){
			$data[$item]=time();
		}

		if(true!==($result=$this->beforeSave($data))){
			return is_object($result)?$result:$this->jerror($result);
		}
		if(!$id=$this->Db->insertGetId($data)) return ErrCode::getError(101);
		if(true!==($result=$this->afterSave($id,$data))){
			return is_object($result)?$result:$this->jerror($result);
		}
		return $this->jsuccess();
	}

	/**
	 * @param $data 提交的数据
	 * @return bool 返回执行结果，非true为错误信息
	 */
	protected function afterSave($id,$data){
		return true;
	}

	/**
	 * @param $id   数据id
	 * @param $pk   数据主键
	 * @return bool 返回执行结果，非true为错误信息
	 */
	protected function beforeDelete($id,$pk){
		return true;
	}


	/**
	 * DELETE
	 * @param $id   删除指定id的数据
	 */
	final public function delete($id){
		$pk=$this->Db->getPk();
		if(true!==($result=$this->beforeDelete($id,$pk))){
			return is_object($result)?$result:$this->jerror($result);
		}
		if(!$this->Db->where($pk,$id)->delete()) return ErrCode::getError(103);//$this->jerror($this->Db->getError());
		if(true!==($result=$this->afterDelete($id,$pk))){
			return is_object($result)?$result:$this->jerror($result);
		}
		return $this->jsuccess(null,'删除成功');
	}

	/**
	 * @param $id   数据id
	 * @param $pk   数据主键
	 * @return bool 返回执行结果，非true为错误信息,也支持返回错误信息数组jtable或ErrCode信息
	 */
	protected function afterDelete($id,$pk){
		return true;
	}
}